#include "cena.hpp"
Cena::Cena(const Cor& _fundo = Cor(0.0,0.0,0.0)) : fundo(_fundo) {
	atenuacao = false;
	a = b = c = 0;
}

Cena::~Cena() { }

int Cena::objetoProximo(Vetor& ponto,const Raio& raio) {
	Cor *c = NULL;
	double distancia = 90.1;
	int j = -1;
	Vetor ponto_teste;
	for(int i =0;i<getObjetosEnd();i++) {
		double valor = getObjeto(i)->intersecao(raio,ponto_teste);
		if(valor != 90.0 && valor < distancia) { /* Checando o mais proximo */
			j= i;
			distancia = valor;
			ponto = ponto_teste;
		}
	}	
	return j;
}

bool Cena::objetoSegmento(const Raio& raio,const double t) {
	Vetor ponto;
	for(int i =0;i<getObjetosEnd();i++) {
		if(getObjeto(i)->intersecao(raio,ponto) < t ) {
			return true;
		}
	}
	/* Se nao achou ninguem que estivesse no caminho */
	return false;
}	

double Cena::getAtenuacao(const double t) const {
	 if(atenuacao) return 1.0/(a*t*t + b*t + c); 
	 else return 1.0; 
}

void Cena::addObjeto(Objeto* _objeto) { objetos.push_back(_objeto); }

void Cena::addLuz(Luz* _luz) { luzes.push_back(_luz); }

void Cena::setFundo(Cor _fundo) { fundo = _fundo; }

void Cena::setAtenuacao(void) { atenuacao = true; }

void Cena::setAtenuacao(double _a,double _b,double _c) {
	a = _a;
	b = _b;
	c = _c;
	atenuacao = true;
}

void Cena::unsetAtenuacao(void) { atenuacao = false; }

int Cena::getObjetosEnd(void) const { return objetos.size(); }

int Cena::getLuzesEnd(void) const { return luzes.size(); }

Objeto* Cena::getObjeto(int index) const { return objetos[index]; }

Luz* Cena::getLuz(int index) const { return luzes[index]; }

Cor Cena::getFundo(void) const { return fundo; }
